// Problem: 
// Contest: 
// URL: 
// Memory Limit: 
// Time Limit: 
// #pragma GCC optimize("Ofast")
// #pragma GCC optimize("unroll-loops")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
	return s*w;
}
//struct node
//{
//	int x,y,z;
//};
int dx[4]={1,1};
int dy[4]={1,-1};
map<pair<int,int>,int>m1,m2;
signed main()
{
	int t=1;
//	cin>>t;
	while(t--)
	{
		int n,m,ans=0;
		cin>>n>>m;
		vector<vector<int>> v(n+1,vector<int>(m+1));
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				int a;
				cin>>a;
				ans+=m1[make_pair(a,i-j)]++;
				ans+=m2[make_pair(a,i+j)]++;
			}
		}
//		int mn=min(n,m);
//		for(int i=1;i<=n;i++)
//		{
//			for(int j=1;j<=m;j++)
//			{
//				for(int z=0;z<2;z++)
//				{
//					for(int k=1;k<=mn;k++)
//					{
//						int x=i+k*dx[z],y=j+k*dy[z];
//						if(x<1||x>n||y<1||y>m)break;
//						if(v[i][j]==v[x][y])
//						{
//							ans++;
//							//cout<<i<<" "<<j<<" "<<x<<" "<<y<<endl;
//						}
//					}
//				}
//			}
//		}
		cout<<ans*2;
	}
	return 0;
}
